#ifndef _BUILDER_H_
#define _BUILDER_H_

class Product
{
public:
    Product();
    ~Product();
    
public:
    void SetParamA();
    void SetParamB();
    void SetParamC();
    
    void Show();
};

class AbstractBuilder
{
public:
    AbstractBuilder();
    virtual ~AbstractBuilder();
    
public:
    virtual Product* CreateProduct() = 0;
    virtual void BuildParamA() = 0;
    virtual void BuildParamB() = 0;
    virtual void BuildParamC() = 0;
    
    virtual Product* GetProduct() = 0;
};

class ConcreteBuilder : public AbstractBuilder
{
public:
    ConcreteBuilder();
    ~ConcreteBuilder();
    
public:
    virtual Product* CreateProduct();
    virtual void BuildParamA();
    virtual void BuildParamB();
    virtual void BuildParamC();
    virtual Product* GetProduct();
    
private:
    Product* product_;
};

#endif // _BUILDER_H_